package com.svs.generator.controller;

import java.io.IOException;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.svs.common.annotation.Log;
import com.svs.common.base.AjaxResult;
import com.svs.common.enums.BusinessType;
import com.svs.framework.web.BaseController;
import com.svs.framework.web.page.TableDataInfo;
import com.svs.generator.domain.BizColumn;
import com.svs.generator.domain.BizTable;
import com.svs.generator.domain.ColInfo;
import com.svs.generator.helper.BizTableHelper;
import com.svs.generator.service.impl.BizColumnService;
import com.svs.generator.service.impl.BizTableGenService;
import com.svs.generator.service.impl.BizTableService;

/**
 * 业务生成 信息操作处理
 * 
 * @author 杜建桥
 * @date 2019-01-31
 */
@Controller
@RequestMapping("/project/bizTable")
public class BizTableController extends BaseController {

	private String prefix = "project/bizTable";

	@Autowired
	BizTableService bizTableService;
	@Autowired
	BizColumnService bizColumnService;
	
	@Autowired
	BizTableGenService bizTableGenService ;

	@RequiresPermissions("project:bizTable:view")
	@GetMapping()
	public String bizTable() {
		return prefix + "/bizTableList";
	}

	/**
	 * 查询业务生成列表
	 */
	@RequiresPermissions("project:bizTable:list")
	@PostMapping("/list")
	@ResponseBody
	public TableDataInfo list(BizTable bizTable) {
		startPage();
		List<BizTable> list = bizTableService.selectAllList(bizTable);
		return getDataTable(list);
	}

	/**
	 * 新增业务生成
	 */
	@GetMapping("/add")
	public String add() {
		return prefix + "/addBizTable";
	}

	/**
	 * 新增保存业务生成
	 */
	@RequiresPermissions("project:bizTable:add")
	@Log(title = "业务生成", businessType = BusinessType.INSERT)
	@PostMapping("/add")
	@ResponseBody
	public AjaxResult addSave(BizTable bizTable) {
		bizTable.setCreateTime(new Date());
		bizTable.setState(BizTableHelper.NOT_CREATE);
		return toAjax(bizTableService.save(bizTable));
	}

	/**
	 * 修改业务生成
	 */
	@GetMapping("/edit/{name}")
	public String edit(@PathVariable("name") String name, ModelMap mmap) {
		BizTable bizTable = bizTableService.selectByPrimaryKey(name);
		mmap.put("bizTable", bizTable);
		BizColumn entity = new BizColumn() ;
		entity.setTableName(name);
		List<BizColumn> colsList = bizColumnService.selectAllList(entity) ;
		mmap.put("colsList", colsList);
		return prefix + "/editBizTable";
	}
	
	
	/**
	 * 修改业务生成
	 */
	@GetMapping("/editCol_Extend/{name}")
	public String editCol_Extend(@PathVariable("name") String name, ModelMap mmap) {
		BizTable bizTable = bizTableService.selectByPrimaryKey(name);
		mmap.put("bizTable", bizTable);
		BizColumn entity = new BizColumn() ;
		entity.setTableName(name);
		List<BizColumn> colsList = bizColumnService.selectAllList(entity) ;
		mmap.put("colsList", colsList);
		return prefix + "/editCol_Extend";
	}

	/**
	 * 修改保存业务生成
	 */
	@RequiresPermissions("project:bizTable:edit")
	@Log(title = "业务生成", businessType = BusinessType.UPDATE)
	@PostMapping("/edit")
	@ResponseBody
	public AjaxResult editSave(BizTable bizTable ,ColInfo colInfo) {
		
		
		List<BizColumn> cols = colInfo.getCloumn() ;
		int len = null != cols ? cols.size() : 0 ;
		boolean flag = false ;
		for(int i=0 ;i< len;i++ ) {
			BizColumn bizCol = cols.get(i) ;
			
			bizCol.setTableName(bizTable.getName());
			if(null == bizCol.getId()) {
				if(StringUtils.isAllEmpty(bizCol.getName()) || StringUtils.isAllEmpty(bizCol.getJdbcType())) {
					continue ;
				}
				
				bizColumnService.save(bizCol) ;
				flag = true ;
			} else {
				bizColumnService.update(bizCol) ;
			}
		}
		if(BizTableHelper.SYNCED.equals(bizTable.getState()) && flag ) {
			bizTable.setState(BizTableHelper.NOT_SYNC);
		}
		
		int result = bizTableService.update(bizTable) ;
		
		return toAjax(result);
	}
	
	
	/**
	 * 创建 同步
	 * 
	 * @param name
	 * @return
	 */
	@RequestMapping("/create")
	@ResponseBody
	public AjaxResult sync(String name) {
		BizTable table = bizTableService.selectByPrimaryKey(name) ;
		
		BizColumn entity = new BizColumn() ;
		entity.setTableName(name);
		List<BizColumn> columnList = bizColumnService.selectAllList(entity) ;
		if(columnList == null || columnList.isEmpty() ) {
			return error("请完善表列字段！") ;
		}
		bizTableService.sync(table, columnList);
		return success();
	}
	
	/**
	 * 删除业务生成
	 */
	@RequiresPermissions("project:bizTable:remove")
	@Log(title = "业务生成", businessType = BusinessType.DELETE)
	@PostMapping("/remove")
	@ResponseBody
	public AjaxResult remove(String[] ids) {
		bizColumnService.deleteByTables(ids) ;
		return toAjax(bizTableService.deleteByPrimaryKeys(ids));
	}
	
	
	
	@Log(title = "删除业务表字段", businessType = BusinessType.DELETE)
	@PostMapping("/delColumn")
	@ResponseBody
	public AjaxResult delColumn(Long id) {
		BizColumn column = bizColumnService.selectByPrimaryKey(id) ;
		BizTable table = bizTableService.selectByPrimaryKey(column.getTableName()) ;
		bizColumnService.deleteByPrimaryKey(id) ;
		table.setState(BizTableHelper.NOT_SYNC);
		int result = bizTableService.update(table) ;
		return toAjax(result) ;
	}
	
	/**
	 * 生成代码
	 */
	@Log(title = "代码生成", businessType = BusinessType.GENCODE)
	@GetMapping("/genCode/{tableName}")
	public void genCode(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException {
		byte[] data = bizTableGenService.generatorCode(tableName);
		response.reset();
		response.setHeader("Content-Disposition", "attachment; filename=\"svs.zip\"");
		response.addHeader("Content-Length", "" + data.length);
		response.setContentType("application/octet-stream; charset=UTF-8");

		IOUtils.write(data, response.getOutputStream());
	} 

}
